package com.zeratul.common.event.core.server.publish.inter;

import cn.hutool.core.util.ObjectUtil;
import com.zeratul.common.event.base.BasePublishServer;
import com.zeratul.common.event.base.interceptor.BasePublishInterceptor;
import com.zeratul.common.event.domain.ZtEvent;
import com.zeratul.common.pool.utils.DelayMsgUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;


/**
 * 延迟消息的发送端拦截器
 */
@Slf4j
@SuppressWarnings("rawtypes")
public class DelayMessageProducerInterceptor implements BasePublishInterceptor {

    //再次获取核心层对象
    @Autowired
    private BasePublishServer basePublishServer;


    /**
     * 判断当前消息是否为延迟消息，如果是延迟消息则进行拦截处理
     * @param ztEvent
     *  如果返回true，则拦截器的interceptor 就会触发，如果false则跳过当前拦截器
     * @return
     * @param <T>
     */
    @Override
    public <T> boolean isSupport(ZtEvent<T> ztEvent) {
        return ObjectUtil.isNotNull(ztEvent.getDelayTime())
                && ztEvent.getDelayTime() > 0
                && !ObjectUtil.equals(ztEvent.getExtra("delay"), true);
    }

    /**
     * 进行延迟处理
     * @param ztEvent 需要处理的消息对象
     *  处理过的消息对象 如果返回null, 则表示中断当前消息的发送
     * @return
     * @param <T>
     */
    @Override
    public <T> ZtEvent<T> interceptor(ZtEvent<T> ztEvent) {
        //将消息放入延迟队列
        DelayMsgUtils.addDelayTask(ztEvent, ztEvent.getDelayTime(), tZtEvent -> {
            //添加延迟标记，防止重复加入延迟队列
            tZtEvent.addExtra("delay", true);
            //再次进行发送
            basePublishServer.sendEvent(ztEvent);
        });
        //返回null，表示终止当前的消息发送
        return null;
    }


}
